class EventBus {
  constructor() {
    this.eventList = {}
  }

  // 订阅(注册事件)
  on(eventName, callback) {
    let taskQueue = this.eventList[eventName]
    if (!taskQueue) {
      taskQueue = []
    }
    taskQueue.push(callback)
  }

  // 触发事件
  emit(eventName, ...args) {
    let taskQueue = this.eventList[eventName]
    if (taskQueue && taskQueue.length > 0) {
      taskQueue.forEach((callback) => {
        callback(...args)
      })
    }
  }

  // 取消订阅
  remove(eventName, callback) {
    let taskQueue = this.eventList[eventName]
    if (taskQueue) {
      taskQueue = taskQueue.filter(fn=>{
        fn != callback
      })
    }
  }

  // 触发1次
  once(eventName, callback){
    const fn = ()=>{
      callback()
      this.remove(eventName, fn)
    }
    this.on(eventName, fn)
  }

}